home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / tex / nghelp.zip / BUFFER.PAS next >
Pascal/Delphi Source File  |  1991-07-13  |  4KB  |  168 lines

  1. {$A+,B-,E+,F-,I+,N-,O-,R-,V-}
  2. {$UNDEF DEBUG}
  3. {$IFDEF DEBUG} {$D+,L+,S+} {$ELSE} {$D-,L-,S-} {$ENDIF}
  4. Unit Buffer;
  5.  
  6. Interface
  7.  
  8.  
  9. Type BigBuffer     = Array [0..65000] of Byte;
  10.      Str79         = String[79];
  11.  
  12.      DiskBufferOBJ = Object
  13.       vDiskError    : Integer; { Set when there is a error }
  14.       vFile         : File;
  15.       vUseBuffer    : Boolean;
  16.       vUpdateBuffer : Boolean;
  17.       vBufferSize   : Word;
  18.       vBufferPtr    : ^BigBuffer;
  19.       vBufStart,
  20.       vBufEnd,
  21.       vFilePtr      : Longint; { Geeft start buffer en eind van buffer aan }
  22.  
  23.       Constructor Init(BufferSize : Word);
  24.       Function    Open(F : Str79) : Boolean;
  25.       Procedure   Close;
  26.       Procedure   ReadIntoBuffer; { Internaly called }
  27.       Procedure   Seek(P : Longint);
  28.       Function    FilePos : Longint;
  29.       Function    ReadByte : Byte;
  30.       Function    ReadChar : Char;
  31.       Function    ReadWord : Word;
  32.       Function    ReadLong : Longint;
  33.       Destructor  Done;
  34.      End;
  35.  
  36.  
  37. Implementation
  38.  
  39.  
  40. Constructor DiskBufferOBJ.Init(BufferSize : Word);
  41. Begin
  42.  vBufferSize   := BufferSize;
  43.  vDiskError    := 0;
  44.  vUpdateBuffer := True;
  45.  
  46.  if MemAvail>=vBufferSize then
  47.   Begin
  48.    GetMem(vBufferPtr,vBufferSize);
  49.    vUseBuffer := True;
  50.   End Else Begin
  51.             vBufferPtr := Nil;
  52.             vUseBuffer := False;
  53.            End;
  54. End;
  55.  
  56. Function DiskBufferOBJ.Open(F : Str79) : Boolean;
  57. Begin
  58.  Open := False;
  59.  Assign(vFile,F);
  60. {$I-}
  61.  Reset(vFile,1);
  62.  if IOResult<>0 then Exit;
  63. {$I+}
  64.  vBufEnd   := 0;
  65.  vBufStart := 0;
  66.  vFilePtr  := -1;
  67.  Open      := True;
  68. End;
  69.  
  70. Procedure DiskBufferOBJ.Close;
  71. Begin
  72. {$I-}
  73.  System.Close(vFile);
  74.  if IOResult<>0 then ;
  75. {$I+}
  76. End;
  77.  
  78. Procedure DiskBufferOBJ.Seek(P : Longint);
  79. Begin
  80.  System.Seek(vFile,P);
  81.  if (P>=vBufStart) And (P<=vBufEnd) then vFilePtr := P
  82.   Else vUpdateBuffer := True;
  83. End;
  84.  
  85. Function DiskBufferOBJ.FilePos : Longint;
  86. Begin
  87.  FilePos := vFilePtr;
  88. End;
  89.  
  90. Procedure DiskBufferOBJ.ReadIntoBuffer;
  91. Var Result : Word;
  92. Begin
  93.  vUpdateBuffer := False;
  94.  vBufStart     := System.FilePos(vFile);
  95.  vFilePtr      := vBufStart;
  96.  BlockRead(vFile,vBufferPtr^,vBufferSize,Result);
  97.  vBufEnd := vFilePtr + Pred(Result);
  98. End;
  99.  
  100. Function DiskBufferOBJ.ReadByte : Byte;
  101. Var Result : Word;
  102.     B      : Byte;
  103. Begin
  104.  if vUseBuffer then
  105.   Begin
  106.    if (vFilePtr>vBufEnd) Or (vFilePtr<vBufStart) Or (vUpdateBuffer) then
  107.     ReadIntoBuffer;
  108.    B := vBufferPtr^[vFilePtr-vBufStart];
  109.    Inc(vFilePtr);
  110.   End Else Begin
  111.             BlockRead(vFile,B,Sizeof(B),Result);
  112.             if Result<>Sizeof(B) then vDiskError := 1;
  113.            End;
  114.  
  115.  ReadByte := B;
  116. End;
  117.  
  118. Function DiskBufferOBJ.ReadChar : Char;
  119. Var Result : Word;
  120.     B      : Byte;
  121. Begin
  122.  if vUseBuffer then
  123.   Begin
  124.    if (vFilePtr>vBufEnd) Or (vFilePtr<vBufStart) Or (vUpdateBuffer) then
  125.     ReadIntoBuffer;
  126.    B := vBufferPtr^[vFilePtr-vBufStart];
  127.    Inc(vFilePtr);
  128.   End Else Begin
  129.             BlockRead(vFile,B,Sizeof(B),Result);
  130.             if Result<>Sizeof(B) then vDiskError := 1;
  131.            End;
  132.  
  133.  ReadChar := Char(B);
  134. End;
  135.  
  136. Function DiskBufferOBJ.ReadWord : Word;
  137. Var W : Word;
  138.     B : Array [1..2] of Byte Absolute W;
  139. Begin
  140.  B[1] := ReadByte;
  141.  B[2] := ReadByte;
  142.  ReadWord := W;
  143. End;
  144.  
  145. Function DiskBufferOBJ.ReadLong : Longint;
  146. Var L : Word;
  147.     B : Array [1..4] of Byte Absolute L;
  148. Begin
  149.  B[1] := ReadByte;
  150.  B[2] := ReadByte;
  151.  B[3] := ReadByte;
  152.  B[4] := ReadByte;
  153.  ReadLong := L;
  154. End;
  155.  
  156. Destructor DiskBufferOBJ.Done;
  157. Begin
  158.  if vBufferPtr<>Nil then
  159.   Begin
  160.    FreeMem(vBufferPtr,vBufferSize);
  161.    vBufferSize := 0;
  162.   End;
  163. End;
  164.  
  165.  
  166.  
  167.  
  168. End.